<!DOCTYPE html>  
<html>
	<meta charset="utf-8" />  
	<title>WebSocket Test</title>  
<body>
	<h2>indexedDB</h2>  
</body>
<script type="text/javascript">

	var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
	if(!indexedDB)
	{
	    console.log("你的浏览器不支持IndexedDB");
	}

	var students=[{ 
            id:1001, 
            name:"Byron", 
            age:14 
        },{ 
            id:1002, 
            name:"Frank", 
            age:15
        },{ 
            id:1003, 
            name:"Aaron", 
            age:16
        }];

    var student={
            id:1004, 
            name:"Tome", 
            age:15
    	}

	function openDB (name,vrs,objStore) {
		const p = new Promise((resolve,reject)=>{

			var version=vrs || 1;

	        var request=indexedDB.open(name,version);//打开或创建数据库
	        request.onerror=function(e){
	            reject(e.currentTarget.error.message)
	        };
	        request.onsuccess=function(e){
	        	
        		myDB.db=e.target.result;//这里才是 indexedDB对象
	        	resolve('success')
	        };

	        request.onblocked = function(event) {
			    // 如果其他标签页已经加载了这个数据库，那么
			    // 在我们可以继续处理之前它需要被关闭。
			    alert("Please close all other tabs with this site open!");
			};
	        //  只能请求>=当前数据库版本号的版本
	        //  大于当前版本号, 则触发 onupgradeneeded, 
	        //  小于当前版本号，则触发 onerror
	        request.onupgradeneeded=function(e){
	            var db=e.target.result;
	            if(!db.objectStoreNames.contains(objStore)){
	                var store=db.createObjectStore(objStore,{keyPath:"id"});

	                store.createIndex('nameIndex','name',{unique:true})
	                store.createIndex('ageIndex','age',{unique:false})
	            }
	            console.log('DB version changed to '+version);
	        };
		})
        return p;
    }
 	
 	var myDB={
	        name:'test1',
	        version:5,
	        db:null,
	        objStore:'students'
	    };

	// 保存数据
	
	// function addData(db,storeName){
 //        var transaction=db.transaction(storeName,'readwrite'); 
 //        var store=transaction.objectStore(storeName); 
      
 //    	for(var i=0;i<students.length;i++){
 //            store.add(students[i]);
 //        }
        
 //    }

 //    openDB(myDB.name,myDB.version,myDB.objStore)
 //    	.then((data)=>{
 //    		if(data){
 //    			addData(myDB.db,myDB.objStore);
 //    		}
 //    	})
 //    	.catch((err)=>{
	// 		console.log('err',err)
	// 	})
	


	// 查询数据
	
	function getDataByKey(db,storeName,key){
	    var transaction=db.transaction(storeName,'readwrite'); 
	    var store=transaction.objectStore(storeName); 
	    var dataRequest=store.get(key); 
	    dataRequest.onsuccess=function(e){//异步的
	        var student=e.target.result; 
	        console.log(student); 
	    };
	}

	openDB(myDB.name,myDB.version,myDB.objStore)
		.then((data)=>{
			if(data){
				getDataByKey(myDB.db,myDB.objStore,1001)
			}
			
		})
		.catch((err)=>{
			console.log('err',err)
		})
	


	// 更新数据(若没有数据 则添加数据)
	/*
	function updateDataByKey(db,storeName,student){
	    var transaction=db.transaction(storeName,'readwrite'); 
	    var store=transaction.objectStore(storeName); 
	    store.put(student); 
	}

	openDB(myDB.name,myDB.version,myDB.objStore)
		.then((data)=>{
			if(data){
				updateDataByKey(myDB.db,myDB.objStore,student)
			}
			
		})
		.catch((err)=>{
			console.log('err',err)
		})
	*/


	// 删除数据
	/*
	function deleteDataByKey(db,storeName,key){
		var transaction=db.transaction(storeName,'readwrite'); 
	    var store=transaction.objectStore(storeName);
	    store.delete(key)
	}

	openDB(myDB.name,myDB.version,myDB.objStore)
		.then((data)=>{
			if(data){
				deleteDataByKey(myDB.db,myDB.objStore,1003)
			}
		})
		.catch((err)=>{
			console.log('err',err)
		})
	*/
	

	// 利用索引和游标快速获取数据
	/*
	var ary=[];
	function getDataIndex(db,storeName){
		var transaction=db.transaction(storeName,'readwrite'); 
	    var store=transaction.objectStore(storeName);
	    var index = store.index('ageIndex');
	    var req=index.openCursor(IDBKeyRange.only(15));
	    req.onsuccess=function(e){
	    	var cursor = e.target.result;
	    	console.log('cursor',cursor)

	    	
	    	if(cursor){
	            var currentStudent=cursor.value;
	            ary.push(currentStudent)
	            console.log(ary);
	            cursor.continue();
	        }
	    }
	}

	openDB(myDB.name,myDB.version,myDB.objStore)
		.then((data)=>{
			if(data){
				getDataIndex(myDB.db,myDB.objStore)
			}
		})
		.catch((err)=>{
			console.log('err',err)
		})
	*/


	// 关闭数据库
    // function closeDB(db){
    //     db.close();
    // }

    // 删除数据库
    // function deleteDB(name){
    //     indexedDB.deleteDatabase(name);
    // }

    // indexedDB.deleteDatabase('test1');




    // IDBKeyRange.only(value):只获取指定数据
 //    IDBKeyRange.lowerBound(value,isOpen)：获取最小是value的数据，第二个参数用来指示是否排除value值本身，也就是数学中的是否是开区间
	// IDBKeyRange.upperBound(value,isOpen)：和上面类似，用于获取最大值是value的数据
	// IDBKeyRange.bound(value1,value2,isOpen1,isOpen2)：value1和value2之间的值
</script>
</html>